Skip to content

11 Fast Fourier Transform

字数 4,632阅读时间 10 分钟Ayaskt
2026/06/16 00:03:58 CST

梦里不觉秋已深,余情岂是为他人。

alt text

章节目录

11-1 DFT 计算问题 DFT Computation Problem

11-1-1 直接计算 Direct Computation

回顾第 5 章的 DFT 约定:

其中:

若直接计算全部 个频域样本,每一个 都需要对 个时域样本加权求和。

因此直接 DFT 的复数运算量为:

计算项 Computation Item运算量 Count
复数乘法 Complex Multiplication
复数加法 Complex Addition

较大时, 级别的计算量会迅速变重。若只需要少量频点,可以单独计算这些 ,也可以使用 Goertzel 算法;若需要全部频点,FFT 更合适。


11-1-2 FFT 的位置 Role of FFT

快速傅里叶变换 Fast Fourier Transform, FFT 是 DFT 的快速计算算法,变换定义仍然是 DFT。

本章只讨论最常用的 radix-2 FFT。设序列长度为:

FFT 的计算目标是把一个 点 DFT 逐层分解成更短的 DFT,直到最后只剩 2 点 DFT。每一层由相同形式的蝶形单元组成。

11-2 旋转因子 Twiddle Factor

11-2-1 定义 Definition

DFT 中的复指数因子称为旋转因子 Twiddle Factor

它在复平面单位圆上取值。FFT 能够减少计算量,主要依赖旋转因子的周期性和对称性。


11-2-2 基本性质 Basic Properties

1. 周期性 Periodicity

因此:

频率索引和时间索引都只需要在长度 的周期内考虑。

2. 共轭对称 Conjugate Symmetry

并且:

3. 降阶关系 Reduction

为正整数,则有:

为整数时:

特别地:

这是 radix-2 FFT 推导中最常用的一步。

4. 半周期符号 Half-Period Sign

为偶数时:

于是:

这个性质使上半频点和下半频点可以共用同一组较短 DFT 结果。

11-3 Cooley-Tukey 算法 Cooley-Tukey FFT

11-3-1 分解思想 Decomposition Idea

Cooley-Tukey FFT 的基本思路是把一个长 DFT 分解成若干短 DFT,再用旋转因子把这些短 DFT 合成。

以 radix-2 为例:

每一层分解只改变数据的组合方式,不改变 DFT 的定义。


11-3-2 计算量 Complexity

radix-2 FFT 一共有:

级。每一级包含 个蝶形单元。

按一般复数乘法计数,全部 点 DFT 的运算量为:

与直接 DFT 对比:

点数 直接乘法直接加法radix-2 FFT 乘法radix-2 FFT 加法

实际实现中, 对应的乘法还能进一步化简。

11-4 按时间抽取 FFT DIT FFT

11-4-1 偶奇抽取 Even-Odd Decimation

按时间抽取 Decimation-in-Time, DIT 先在时域把输入序列分成偶序号和奇序号两部分:

将它们代入 DFT 定义:

定义两个 点 DFT:

于是:

其中 表示对 取模。


11-4-2 蝶形计算 Butterfly Computation

利用 的周期性,对 有:

由此得到 DIT 的基本蝶形:

每个蝶形把两个较短 DFT 的同序号输出合成两个较长 DFT 的输出。

DIT 的典型特征:

  • 输入按时间索引不断偶奇抽取;
  • 输出可以保持自然顺序;
  • 若采用原地计算,输入通常需要先排成位反转顺序。

11-5 按频率抽取 FFT DIF FFT

11-5-1 频域抽取 Frequency Decimation

按频率抽取 Decimation-in-Frequency, DIF 从输出频点的偶数项和奇数项出发。

先把输入序列按前后两半分组:

时:

时:

定义:

则有:

DIF 的蝶形先做加减,再把差值支路乘以旋转因子。


11-5-2 DIT 与 DIF 对比 DIT and DIF Comparison

DIT 与 DIF 的 8 点 FFT 流图对比

DIT 和 DIF 的运算量相同,都是:

二者的差别主要在数据顺序:

算法 Algorithm输入顺序 Input Order输出顺序 Output Order蝶形位置
DIT FFT位反转顺序自然顺序先小 DFT,后合成
DIF FFT自然顺序位反转顺序先分解,后小 DFT

DIF 的流图可以看作 DIT 流图的转置形式。实际程序中选择 DIT 或 DIF,通常取决于数据进入和离开 FFT 模块时更方便采用哪一种顺序。

11-6 用 FFT 计算 IDFT IDFT Using FFT

IDFT 的定义为:

对两边取共轭:

因此:

右侧正好是序列 点 DFT。于是可以用 FFT 计算 IDFT:

对应步骤:

  1. 对频域序列 取共轭;
  2. 做一次 FFT;
  3. 对 FFT 输出取共轭;
  4. 乘以

这也是许多库函数中 ifft 可以复用 fft 内核的原因。

11-7 MATLAB 中的 DFT/IDFT MATLAB DFT and IDFT

11-7-1 直接矩阵计算 Matrix Computation

DFT 可以写成矩阵乘法:

其中:

IDFT 对应:

MATLAB 中可以直接构造 DFT 矩阵:

matlab
N = length(x);
n = 0:N-1;
k = n.';
W = exp(-1j*2*pi/N);
D = W .^ (k*n);

X = D * x(:);
x_rec = (1/N) * conj(D) * X;

这种写法适合验证公式。实际计算不建议用它处理大规模数据,因为矩阵乘法仍然是 级别。


11-7-2 fft 与 ifft 函数 fft and ifft

MATLAB 的 DFT 与 IDFT 通常直接使用:

matlab
X = fft(x, N);
x_rec = ifft(X, N);

若未给出 fft(x) 默认使用 length(x)。若给出更大的 ,MATLAB 会在序列尾部补零。

线性卷积也可以通过 FFT 计算。设 长度为 长度为 ,应取:

对应 MATLAB 写法:

matlab
N = length(x) + length(h) - 1;
y = ifft(fft(x, N) .* fft(h, N));

补零到更长的 可以让频谱采样更密,但不会改变原序列本身包含的频率信息。

11-8 位反转地址 Bit-Reversed Addressing

radix-2 FFT 的每一级都在二进制索引上分组。若:

则位反转地址为:

为例:

原地址 二进制位反转二进制位反转地址
000000
001100
010010
011110
100001
101101
110011
111111

DIT 常把输入预先排成位反转顺序,使输出自然有序;DIF 常保持输入自然有序,使输出落在位反转顺序。硬件或高性能库中通常会用专门的位反转寻址来减少数据搬移。

除特别注明外,本站原创内容采用 CC BY-NC-SA 4.0 协议授权;引用的歌词、课程材料、图片等第三方内容版权归原权利人所有。
Built with VitePress.